{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "899f9084-8f53-4609-ac9d-72771675f53e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "加载数据集...\n",
      "加载tokenizer...\n",
      "处理数据集...\n",
      "配置QLoRA...\n",
      "加载模型...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No label_names provided for model class `PeftModelForCausalLM`. Since `PeftModel` hides base models input arguments, if label_names is not given, label_names can't be set automatically within `Trainer`. Note that empty label_names list will be used instead.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "trainable params: 6,291,456 || all params: 565,506,048 || trainable%: 1.1125\n",
      "开始训练...\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='313' max='313' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [313/313 49:41, Epoch 1/1]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Step</th>\n",
       "      <th>Training Loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>10</td>\n",
       "      <td>3.553600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>20</td>\n",
       "      <td>3.454600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>30</td>\n",
       "      <td>3.318800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>40</td>\n",
       "      <td>3.254000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>50</td>\n",
       "      <td>3.213000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>60</td>\n",
       "      <td>3.213300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>70</td>\n",
       "      <td>3.177600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>80</td>\n",
       "      <td>3.177600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>90</td>\n",
       "      <td>3.168400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>100</td>\n",
       "      <td>3.136600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>110</td>\n",
       "      <td>3.106500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>120</td>\n",
       "      <td>3.107600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>130</td>\n",
       "      <td>3.107700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>140</td>\n",
       "      <td>3.106500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>150</td>\n",
       "      <td>3.090400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>160</td>\n",
       "      <td>3.091500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>170</td>\n",
       "      <td>3.075500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>180</td>\n",
       "      <td>3.059900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>190</td>\n",
       "      <td>3.075800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>200</td>\n",
       "      <td>3.042000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>210</td>\n",
       "      <td>3.052600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>220</td>\n",
       "      <td>3.017800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>230</td>\n",
       "      <td>3.052500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>240</td>\n",
       "      <td>3.050000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>250</td>\n",
       "      <td>3.044000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>260</td>\n",
       "      <td>3.093300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>270</td>\n",
       "      <td>2.983500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>280</td>\n",
       "      <td>3.060900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>290</td>\n",
       "      <td>3.010400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>300</td>\n",
       "      <td>2.981300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>310</td>\n",
       "      <td>2.998500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型保存完成!\n"
     ]
    },
    {
     "data": {
      "image/png": "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6lNPPaVWqVJF9fb2Nr4vatasaXF8qpr9c87rK+c4Fi1apDZt2lT18/NT/fz81KZNm6qLFi0ye9687iNl8MknnxjvvVWpUiVVURT17NmzeR7jb7/9pgJQO3XqVLAfyn/yu49UbtLS0tQxY8aoVatWVb29vdUaNWqo06ZNUzMzMy3eQyiv+0hZeh/kdp+ivO4jZel9kdv7KSsrS502bZparVo11cvLSw0PD1dnzJih7tu3TwWgvvrqq7keu6XXzusr52v/9NNPaps2bdSAgADV29tbjYyMVD/44AM1KyvL5HlXrFihDhw4UI2IiFD9/PzUoKAgtWHDhurs2bPVtLQ0436bN29Whw0bptaqVUsNCAhQ/f391bp166rvvvuuev369QIdg0FmZqa6aNEitWvXrmq5cuVUT09PNSAgQH3wwQfVd9991+T+VwafffaZWqNGDdXT01OtXLmyOmnSpFzfA/m9pwzu3LmjBgYGqgDUZs2a5bnviRMn1GeeeUatUqWK6uXlpQYHB6uRkZHq6NGjTe5DR0R5U1Q1xy3BiYiIcnH9+nU8/PDDuH79OrZu3ZpvK3xyHwsXLsRzzz2Hzz//3C5dEImInBELKSIiKrDY2Fg0b94cWq0W27dvR2RkpKOHRMUoPj7e2J7e4PLly2jRogUuXbqEc+fOFehmzkREMuA1UkREVGD16tXDhg0bsG3bNuzZs4eFlJuZNWsWNm7ciFatWqFs2bK4cOECNmzYgLS0NERFRbGIIiK3wjNSREREVCCbN2/GvHnz8PfffyM5ORk+Pj5o0KABRo0ahcGDBzt6eERExYqFFBERERERkZV4HykiIiIiIiIrsZAiIiIiIiKykts3m9Dr9bhy5QoCAgJyvWkjERERERHJT1VVpKWloUKFCvneZNztC6krV66wyxARERERERldvHgRlSpVynMfty+kAgICAIgfVmBgYL7763Q6xMbGol69etBqtfYeHhUDZion5iofZion5iofZiond8k1NTUVYWFhxhohL25fSBmm8wUGBha4kPL390dgYKDUbyJ3wkzlxFzlw0zlxFzlw0zl5G65FuSSH7dvf56amoqgoCCkpKQUqJBSVRXp6enw8fHhNVWSYKZyYq7yYaZyYq7yYaZycpdcrakN2LWvELy8vBw9BLIxZion5iofZion5iofZion5mqKhZSV9Ho9YmJi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pIiIqFnUvfKkUVxcjNDQUCiVSsTFxcHPzw+2trY4e/Ys3nnnHYP+x97KyqrBdmHAp3f8kX2fhFKpxIgRIzBixAi0adMG27dvx8mTJxEaGtroPpqfwdq1a/Hcc881uI2Dg8Njv2/9STHs7OyQmpqKI0eO4IcffsDBgwfx7bffYvjw4UhKSmr050JERIZjIUVERE9NSkoKCgsLsXv3bgwdOlTbnp2dbcJePeLm5gZbW1tkZWXprWuozRj9+/fH9u3bkZubC0C/2NHQ3HqoVCoRHh5u0LEzMzPh4+Oj01eVSqUz66FcLkdYWBjCwsLwySef4IMPPsB7772HI0eOGPx9iIiocby1j4iInhrNlY+6V4Cqq6vx6aefmqpLOqysrBAeHo7ExETcvn1b256VlYUDBw40uX9FRQXS0tIaXKfZ39/fHwDQtm1bAOqrdHUFBQXBz88PH330EcrLy/WOc/fuXb22TZs26Sxv2LABALTPdRUVFento7naVVVV1dhwiIjICLwiRURET82gQYPQrl07TJ8+HQsWLIBMJsOXX3751G6texIrV65EUlISBg8ejDlz5qC2thYbN25EQEAA0tPTH7tvRUUFBg0ahOeffx6RkZHo3LkziouLkZiYiJ9//hnjxo1D3759AaivPDk7O+Ozzz6Do6Mj2rZti+DgYPj4+GDr1q2IiopCr169MHPmTHTs2BG3bt3CkSNHoFQqsXfvXp3vm52djTFjxiAyMhJpaWn46quvMGXKFAQGBgIA4uLikJqailGjRqFLly7Iz8/Hp59+ik6dOuGFF154Kj9HIqLWhoUUERE9Ne3bt8e+ffuwePFi/P3vf0e7du0wbdo0hIWFISIiwtTdA6C+InTgwAG8/fbbWL58OTp37oy4uDhcvny5yVkFnZ2d8c9//hM//PAD4uPjkZeXBysrK/j7+2Pt2rVYsGCBdlvNM1PLli3DG2+8gZqaGsTHx8PHxwfDhg1DWloaVq1ahY0bN6K8vBweHh4IDg7G7Nmz9b7vt99+i5iYGCxduhTW1taYN2+ezmdyjRkzBtevX8e//vUvFBQUwNXVFaGhoYiNjYWTk1Pz/fCIiFoxmTCnPwsSERGZiXHjxuHixYvaWfXMwcqVKxEbG4u7d+/C1dXV1N0hImrV+IwUERG1eg8ePNBZzszMxP79+zFs2DDTdIiIiMweb+0jIqJWz9fXFzNmzICvry9+//13bN68GTY2Nvjb3/5m6q4REZGZYiFFREStXmRkJHbu3Im8vDwoFAqEhITggw8+0PvgWyIiIg0+I0VERERERGQkPiNFRERERERkJBZSRERERERERmIhRUREREREZCQWUkREREREREZiIUVERERERGQkFlJERERERERGYiFFRERERERkJBZSRERERERERvp/AhISPCeutB4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 在 AdvertiseGen 数据集上使用 QLoRA 微调 bigscience/bloom-560m\n",
    "# 完整可执行代码，包含详细注释\n",
    "\n",
    "# 导入必要的库\n",
    "import torch\n",
    "from datasets import load_dataset\n",
    "from transformers import (\n",
    "    AutoTokenizer, \n",
    "    AutoModelForCausalLM,\n",
    "    BitsAndBytesConfig, \n",
    "    TrainingArguments, \n",
    "    Trainer,\n",
    "    DataCollatorForSeq2Seq\n",
    ")\n",
    "from peft import (\n",
    "    LoraConfig, \n",
    "    get_peft_model, \n",
    "    prepare_model_for_kbit_training,\n",
    "    PeftModel\n",
    ")\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# 1. 设置训练参数和配置\n",
    "model_name_or_path = 'bigscience/bloom-560m'  # 使用的预训练模型\n",
    "train_data_path = 'HasturOfficial/adgen'     # 训练数据集路径\n",
    "seed = 8                                     # 随机种子\n",
    "max_input_length = 512                       # 输入文本最大长度\n",
    "max_output_length = 256                      # 输出文本最大长度\n",
    "lora_rank = 16                               # LoRA的秩\n",
    "lora_alpha = 32                              # LoRA的alpha值\n",
    "lora_dropout = 0.1                           # LoRA的dropout率\n",
    "prompt_text = '请根据以下内容生成广告文案：\\n'  # 提示词前缀\n",
    "compute_dtype = 'bf16'                       # 计算数据类型\n",
    "\n",
    "# 2. 加载并准备数据集\n",
    "print(\"加载数据集...\")\n",
    "dataset = load_dataset(train_data_path)\n",
    "dataset[\"train\"] = dataset[\"train\"].select(range(10000))  # 使用前10000条数据加速训练\n",
    "\n",
    "# 3. 加载tokenizer\n",
    "print(\"加载tokenizer...\")\n",
    "tokenizer = AutoTokenizer.from_pretrained(\n",
    "    model_name_or_path,\n",
    "    padding_side=\"right\",    # 填充在右侧\n",
    "    truncation_side=\"left\"   # 截断在左侧\n",
    ")\n",
    "tokenizer.pad_token = tokenizer.eos_token  # 使用eos_token作为填充token\n",
    "\n",
    "# 4. 定义数据预处理函数\n",
    "def tokenize_func(example):\n",
    "    \"\"\"\n",
    "    将数据样本转换为模型输入格式\n",
    "    参数:\n",
    "        example: 包含'content'和'summary'的数据样本\n",
    "    返回:\n",
    "        包含'input_ids', 'attention_mask'和'labels'的字典\n",
    "    \"\"\"\n",
    "    # 构建输入和输出文本\n",
    "    input_text = f\"{prompt_text}{example['content']}\\n广告文案：\"\n",
    "    output_text = example['summary'] + tokenizer.eos_token\n",
    "    \n",
    "    # 分别编码输入和输出\n",
    "    tokenized_input = tokenizer(\n",
    "        input_text,\n",
    "        truncation=True,\n",
    "        max_length=max_input_length,\n",
    "        padding=False\n",
    "    )\n",
    "    \n",
    "    tokenized_output = tokenizer(\n",
    "        output_text,\n",
    "        truncation=True,\n",
    "        max_length=max_output_length,\n",
    "        padding=False\n",
    "    )\n",
    "    \n",
    "    # 合并结果\n",
    "    input_ids = tokenized_input[\"input_ids\"] + tokenized_output[\"input_ids\"]\n",
    "    attention_mask = tokenized_input[\"attention_mask\"] + tokenized_output[\"attention_mask\"]\n",
    "    \n",
    "    # 创建labels (只计算输出部分的loss)\n",
    "    labels = [-100] * len(tokenized_input[\"input_ids\"]) + tokenized_output[\"input_ids\"]\n",
    "    \n",
    "    return {\n",
    "        \"input_ids\": input_ids,\n",
    "        \"attention_mask\": attention_mask,\n",
    "        \"labels\": labels\n",
    "    }\n",
    "\n",
    "# 处理数据集\n",
    "print(\"处理数据集...\")\n",
    "tokenized_dataset = dataset[\"train\"].map(\n",
    "    tokenize_func,\n",
    "    batched=False,\n",
    "    remove_columns=dataset[\"train\"].column_names\n",
    ")\n",
    "\n",
    "# 5. 自定义数据整理器\n",
    "class CustomDataCollator:\n",
    "    \"\"\"处理变长序列并确保批次内长度一致\"\"\"\n",
    "    def __init__(self, tokenizer, max_length=1024):\n",
    "        self.tokenizer = tokenizer\n",
    "        self.max_length = max_length\n",
    "    \n",
    "    def __call__(self, features):\n",
    "        # 找出批次中最长的序列\n",
    "        max_len = max(len(f[\"input_ids\"]) for f in features)\n",
    "        max_len = min(max_len, self.max_length)  # 不超过最大长度限制\n",
    "        \n",
    "        batch = {\n",
    "            \"input_ids\": [],\n",
    "            \"attention_mask\": [],\n",
    "            \"labels\": []\n",
    "        }\n",
    "        \n",
    "        for feature in features:\n",
    "            # 截断或填充每个特征\n",
    "            input_ids = feature[\"input_ids\"][:max_len]\n",
    "            attention_mask = feature[\"attention_mask\"][:max_len]\n",
    "            labels = feature[\"labels\"][:max_len]\n",
    "            \n",
    "            # 计算需要填充的长度\n",
    "            pad_len = max_len - len(input_ids)\n",
    "            \n",
    "            # 填充input_ids, attention_mask和labels\n",
    "            batch[\"input_ids\"].append(input_ids + [self.tokenizer.pad_token_id] * pad_len)\n",
    "            batch[\"attention_mask\"].append(attention_mask + [0] * pad_len)\n",
    "            batch[\"labels\"].append(labels + [-100] * pad_len)\n",
    "        \n",
    "        # 转换为PyTorch tensor\n",
    "        batch = {k: torch.tensor(v) for k, v in batch.items()}\n",
    "        return batch\n",
    "\n",
    "# 初始化数据整理器\n",
    "data_collator = CustomDataCollator(tokenizer)\n",
    "\n",
    "# 6. 配置QLoRA量化参数\n",
    "print(\"配置QLoRA...\")\n",
    "bnb_config = BitsAndBytesConfig(\n",
    "    load_in_4bit=True,                  # 使用4-bit量化\n",
    "    bnb_4bit_quant_type=\"nf4\",          # 使用nf4量化类型\n",
    "    bnb_4bit_use_double_quant=True,     # 使用双重量化\n",
    "    bnb_4bit_compute_dtype=torch.bfloat16  # 计算时使用bfloat16\n",
    ")\n",
    "\n",
    "# 7. 加载模型\n",
    "print(\"加载模型...\")\n",
    "model = AutoModelForCausalLM.from_pretrained(\n",
    "    model_name_or_path,\n",
    "    quantization_config=bnb_config,  # 应用量化配置\n",
    "    device_map=\"auto\",              # 自动分配设备\n",
    "    use_cache=False,                # 禁用缓存以支持梯度检查点\n",
    "    trust_remote_code=True          # 信任远程代码\n",
    ")\n",
    "\n",
    "# 准备模型进行k-bit训练\n",
    "model = prepare_model_for_kbit_training(model)\n",
    "\n",
    "# 8. 配置LoRA参数\n",
    "target_modules = [\n",
    "    \"query_key_value\",  # 注意力层的QKV矩阵\n",
    "    \"dense\",           # 密集层\n",
    "    \"dense_h_to_4h\",   # 第一个前馈层\n",
    "    \"dense_4h_to_h\"    # 第二个前馈层\n",
    "]\n",
    "\n",
    "lora_config = LoraConfig(\n",
    "    target_modules=target_modules,  # 应用LoRA的目标模块\n",
    "    r=lora_rank,                   # LoRA的秩\n",
    "    lora_alpha=lora_alpha,         # LoRA的alpha值\n",
    "    lora_dropout=lora_dropout,     # LoRA层的dropout率\n",
    "    bias=\"none\",                   # 不添加偏置\n",
    "    task_type=\"CAUSAL_LM\"          # 任务类型为因果语言模型\n",
    ")\n",
    "\n",
    "# 将LoRA适配器添加到模型中\n",
    "model = get_peft_model(model, lora_config)\n",
    "model.print_trainable_parameters()  # 打印可训练参数数量\n",
    "\n",
    "# 9. 配置训练参数\n",
    "training_args = TrainingArguments(\n",
    "    output_dir=\"models/bloom-560m-adgen-lora\",  # 输出目录\n",
    "    per_device_train_batch_size=8,             # 每个设备的训练批量大小（设置为16在训练过程中会OOM）\n",
    "    gradient_accumulation_steps=4,              # 梯度累积步数\n",
    "    num_train_epochs=1,                         # 训练轮次\n",
    "    learning_rate=3e-4,                         # 学习率\n",
    "    logging_steps=10,                           # 日志记录步数\n",
    "    save_steps=100,                             # 模型保存步数\n",
    "    eval_strategy=\"no\",                         # 不进行评估\n",
    "    bf16=True,                                  # 使用bfloat16\n",
    "    remove_unused_columns=False,                # 不移除未使用的列\n",
    "    report_to=[\"tensorboard\"],                  # 使用tensorboard记录\n",
    "    optim=\"paged_adamw_32bit\",                  # 使用分页的AdamW优化器\n",
    "    lr_scheduler_type=\"cosine\",                 # 使用cosine学习率调度器\n",
    "    warmup_ratio=0.1,                           # 预热比例\n",
    "    max_grad_norm=0.3,                          # 梯度裁剪阈值\n",
    "    gradient_checkpointing=True,                # 使用梯度检查点\n",
    "    logging_strategy=\"steps\",                   # 按步记录日志\n",
    "    save_strategy=\"steps\",                      # 按步保存模型\n",
    "    disable_tqdm=False                          # 不禁用进度条\n",
    ")\n",
    "\n",
    "# 10. 初始化Trainer\n",
    "trainer = Trainer(\n",
    "    model=model,\n",
    "    args=training_args,\n",
    "    train_dataset=tokenized_dataset,\n",
    "    data_collator=data_collator,\n",
    ")\n",
    "\n",
    "# 11. 训练模型\n",
    "print(\"开始训练...\")\n",
    "train_result = trainer.train()\n",
    "\n",
    "# 12. 保存模型\n",
    "model.save_pretrained(\"models/bloom-560m-adgen-lora-final\")\n",
    "print(\"模型保存完成!\")\n",
    "\n",
    "# 13. 绘制训练损失曲线\n",
    "if hasattr(trainer.state, 'log_history'):\n",
    "    log_history = trainer.state.log_history\n",
    "    train_loss = [log['loss'] for log in log_history if 'loss' in log]\n",
    "    steps = [log['step'] for log in log_history if 'loss' in log]\n",
    "    \n",
    "    if len(train_loss) > 0:\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(steps, train_loss, 'b-', linewidth=2, label='Training Loss')\n",
    "        plt.title('Bloom-560m QLoRA Training Loss Curve', fontsize=14)\n",
    "        plt.xlabel('Training Steps', fontsize=12)\n",
    "        plt.ylabel('Loss', fontsize=12)\n",
    "        plt.grid(True, linestyle='--', alpha=0.6)\n",
    "        \n",
    "        # 标记最低损失点\n",
    "        min_loss_idx = np.argmin(train_loss)\n",
    "        plt.scatter(steps[min_loss_idx], train_loss[min_loss_idx], \n",
    "                   c='red', s=100, label=f'Min Loss: {train_loss[min_loss_idx]:.3f}')\n",
    "        plt.legend(fontsize=12)\n",
    "        plt.savefig(\"bloom_training_loss.png\")\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"警告: 没有可用的损失数据\")\n",
    "else:\n",
    "    print(\"警告: 没有训练记录\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "206e5d9b-239b-47b1-9c72-4ebbc0c7be01",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "加载tokenizer...\n",
      "\n",
      "加载原始模型进行比较...\n",
      "\n",
      "=== 原始模型输出 ===\n",
      "智能手机，搭载最新AI芯片，超长续航。作为智能手机行业的佼佼者，三星电子在手机上开发出了很多新功能，比如屏幕指纹、屏幕无声、无感触屏等等。这些功能都让智能手机拥有了超长续航的优势，比如说三星GalaxyNote8就搭载了3260mAh的电池，在充满电的时候可以坚持到2个半小时。\n",
      "\n",
      "随着人们的生活水平的不断提高，如今人们的生活压力也越来越大，尤其是熬夜加班的人更是普遍。为了能够缓解压力，很多人都会选择选择一些按摩的保健方式，但是按摩的效果真的是太差了，而且很多时候按摩的效果都是很有限的，而且还可能会伤害到我们的皮肤。那么按摩的效果到底好不好呢？今天小编就为大家推荐一些按摩的保健保健方法，希望能够帮助大家缓解压力。\n",
      "\n",
      "加载微调后的模型...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/dist-packages/peft/tuners/lora/bnb.py:348: UserWarning: Merge lora module to 4-bit linear may get different generations due to rounding errors.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== 微调后模型输出 ===\n",
      "智能手机越来越好，而智能手机续航问题也是网友热议的话题，现在，苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。当然，对于苹果手机，续航问题也是网友热议的话题，现在，苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。当然，对于苹果手机，续航问题也是网友热议的话题，现在，苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。当然，对于苹果手机，续航问题也是网友热议的话题，现在，苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。但是，现在苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。但是，现在苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。但是，现在苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。但是，现在苹果手机已经搭载了最新版 AI芯片，续航时间已经突破了7小时。但是，现在苹果手机已经搭载了最新版 AI芯片，续航时间已经\n",
      "\n",
      "测试完成!\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig  # 修改这里\n",
    "from peft import PeftModel, PeftConfig\n",
    "\n",
    "# 1. 配置参数\n",
    "model_name = 'bigscience/bloom-560m'\n",
    "peft_model_path = \"models/bloom-560m-adgen-lora-final\"  # 替换为实际路径\n",
    "prompt_text = '请根据以下内容生成广告文案：\\n'  # 提示词前缀\n",
    "max_input_length = 512                       # 输入文本最大长度\n",
    "max_output_length = 256                      # 输出文本最大长度\n",
    "\n",
    "print(\"加载tokenizer...\")\n",
    "tokenizer = AutoTokenizer.from_pretrained(\n",
    "    model_name,\n",
    "    padding_side=\"right\",    # 填充在右侧\n",
    "    truncation_side=\"left\"   # 截断在左侧\n",
    ")\n",
    "tokenizer.pad_token = tokenizer.eos_token  # 使用eos_token作为填充token\n",
    "\n",
    "# 定义生成函数\n",
    "def generate_response(prompt, model, tokenizer):\n",
    "    \"\"\"\n",
    "    使用模型生成广告文案\n",
    "    参数:\n",
    "        prompt: 输入提示\n",
    "        model: 使用的模型\n",
    "        tokenizer: 使用的tokenizer\n",
    "    返回:\n",
    "        生成的广告文案\n",
    "    \"\"\"\n",
    "    # 构建完整输入\n",
    "    input_text = f\"{prompt_text}{prompt}\\n广告文案：\"\n",
    "    \n",
    "    # 对输入进行tokenize\n",
    "    inputs = tokenizer(\n",
    "        input_text,\n",
    "        return_tensors=\"pt\",\n",
    "        max_length=max_input_length,\n",
    "        truncation=True,\n",
    "        padding=True\n",
    "    ).to(model.device)\n",
    "    \n",
    "    # 生成文本\n",
    "    outputs = model.generate(\n",
    "        **inputs,\n",
    "        max_new_tokens=max_output_length,  # 最大生成token数\n",
    "        temperature=0.7,                  # 温度参数\n",
    "        top_p=0.9,                        # 核采样参数\n",
    "        do_sample=True,                   # 使用采样\n",
    "        pad_token_id=tokenizer.eos_token_id  # 填充token ID\n",
    "    )\n",
    "    \n",
    "    # 解码并提取生成部分\n",
    "    full_text = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
    "    generated_part = full_text[len(input_text):]  # 只取提示文本之后的部分\n",
    "    \n",
    "    return generated_part.strip()\n",
    "\n",
    "# 测试模型\n",
    "test_prompt = \"新款智能手机，搭载最新AI芯片，超长续航\"\n",
    "\n",
    "# 2. 加载基础模型（4-bit量化）\n",
    "q_config = BitsAndBytesConfig(\n",
    "    load_in_4bit=True,\n",
    "    bnb_4bit_quant_type=\"nf4\",\n",
    "    bnb_4bit_use_double_quant=True,\n",
    "    bnb_4bit_compute_dtype=torch.float16\n",
    ")\n",
    "\n",
    "print(\"\\n加载原始模型进行比较...\")\n",
    "original_model = AutoModelForCausalLM.from_pretrained(  # 修改这里\n",
    "    model_name,\n",
    "    quantization_config=q_config,\n",
    "    trust_remote_code=True,\n",
    "    device_map=\"auto\",\n",
    "    torch_dtype=torch.bfloat16\n",
    ")\n",
    "original_model.eval()\n",
    "\n",
    "print(\"\\n=== 原始模型输出 ===\")\n",
    "print(generate_response(test_prompt, original_model, tokenizer))\n",
    "\n",
    "# 尝试加载微调后的模型\n",
    "try:\n",
    "    print(\"\\n加载微调后的模型...\")\n",
    "    tuned_model = PeftModel.from_pretrained(\n",
    "        original_model,\n",
    "        peft_model_path\n",
    "    )\n",
    "    tuned_model = tuned_model.merge_and_unload()  # 合并LoRA权重到原模型\n",
    "except Exception as e:\n",
    "    print(f\"加载微调模型失败: {e}\")\n",
    "    tuned_model = original_model  # 如果加载失败，使用原始模型\n",
    "\n",
    "print(\"\\n=== 微调后模型输出 ===\")\n",
    "print(generate_response(test_prompt, tuned_model, tokenizer))\n",
    "\n",
    "print(\"\\n测试完成!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "64825199-3467-4066-8b8b-039d445dbc73",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "加载tokenizer...\n",
      "\n",
      "加载原始模型...\n",
      "\n",
      "=== 原始模型输出 ===\n",
      "新款智能手机，搭载最新AI芯片，超长续航，让用户体验更加安心。\n",
      "新款智能手机，搭载最新AI芯片，超长续航，让用户体验更加安心。\n",
      "\n",
      "【导语】：大家好，我是【新世界】，欢迎大家来本站了解关于【新世界】的更多信息。新世界【新世界】专业从事互联网营销服务，为您提供【新世界】免费在线客服，为您解答关于【新世界】的疑问。新世界【新世界】诚邀您的加入！\n",
      "\n",
      "《无尽的荣耀》是2020年上映的动作冒险电影，由斯蒂芬·金执导，凯文·史派西、莎拉·马修、杰森·斯坦森、伊莲·莱恩、米歇尔·杜兰特、凯文·麦克莱恩、詹姆斯·麦卡锡、理查德·卡内基、大卫·威利、迈克尔·辛纳特、詹姆斯·卡迪恩、肖恩·宾、梅尔·吉布森、凯瑟琳·毕格罗、詹姆斯·加纳、肯·吉伦哈尔、杰森·马努主演。影片讲述了主人公詹姆斯·卡迪恩因为一场意外，穿越到了过去，成为了“无尽的荣耀”。\n",
      "\n",
      "加载微调后的模型...\n",
      "合并LoRA权重...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/dist-packages/peft/tuners/lora/bnb.py:348: UserWarning: Merge lora module to 4-bit linear may get different generations due to rounding errors.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== 微调后模型输出 ===\n",
      "智能手机，搭载最新AI芯片，超长续航，屏幕大，分辨率高，性能强，可实现多屏互动，使用体验更好。此外，采用高通骁龙865芯片，在手机使用过程中，手机运行速度更快，玩游戏更流畅，流畅体验好。\n",
      "\n",
      "测试完成!\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig\n",
    "from peft import PeftModel\n",
    "\n",
    "# 1. 配置参数\n",
    "model_name = 'bigscience/bloom-560m'\n",
    "peft_model_path = \"models/bloom-560m-adgen-lora-final\"  # 替换为实际路径\n",
    "prompt_text = '请根据以下内容生成广告文案：\\n'  # 提示词前缀\n",
    "max_input_length = 512                       # 输入文本最大长度\n",
    "max_output_length = 256                      # 输出文本最大长度\n",
    "\n",
    "# 2. 加载tokenizer\n",
    "print(\"加载tokenizer...\")\n",
    "tokenizer = AutoTokenizer.from_pretrained(\n",
    "    model_name,\n",
    "    padding_side=\"right\",    # 填充在右侧\n",
    "    truncation_side=\"left\"   # 截断在左侧\n",
    ")\n",
    "tokenizer.pad_token = tokenizer.eos_token  # 使用eos_token作为填充token\n",
    "\n",
    "# 3. 配置4-bit量化\n",
    "q_config = BitsAndBytesConfig(\n",
    "    load_in_4bit=True,\n",
    "    bnb_4bit_quant_type=\"nf4\",\n",
    "    bnb_4bit_use_double_quant=True,\n",
    "    bnb_4bit_compute_dtype=torch.float16\n",
    ")\n",
    "\n",
    "# 4. 加载基础模型\n",
    "print(\"\\n加载原始模型...\")\n",
    "original_model = AutoModelForCausalLM.from_pretrained(\n",
    "    model_name,\n",
    "    quantization_config=q_config,\n",
    "    device_map=\"auto\",\n",
    "    trust_remote_code=True\n",
    ")\n",
    "\n",
    "# 5. 定义生成函数（适配4-bit量化）\n",
    "def generate_response(prompt, model, tokenizer):\n",
    "    \"\"\"\n",
    "    使用模型生成广告文案（适配4-bit量化版本）\n",
    "    \"\"\"\n",
    "    # 构建完整输入\n",
    "    input_text = f\"{prompt_text}{prompt}\\n广告文案：\"\n",
    "    \n",
    "    # 对输入进行tokenize\n",
    "    inputs = tokenizer(\n",
    "        input_text,\n",
    "        return_tensors=\"pt\",\n",
    "        max_length=max_input_length,\n",
    "        truncation=True,\n",
    "        padding=True\n",
    "    ).to(model.device)\n",
    "    \n",
    "    # 生成文本（禁用缓存以避免meta tensor错误）\n",
    "    with torch.no_grad():\n",
    "        outputs = model.generate(\n",
    "            **inputs,\n",
    "            max_new_tokens=max_output_length,\n",
    "            temperature=0.7,\n",
    "            top_p=0.9,\n",
    "            do_sample=True,\n",
    "            pad_token_id=tokenizer.eos_token_id,\n",
    "            use_cache=False  # 禁用缓存\n",
    "        )\n",
    "    \n",
    "    # 解码并提取生成部分\n",
    "    full_text = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
    "    generated_part = full_text[len(input_text):]\n",
    "    \n",
    "    return generated_part.strip()\n",
    "\n",
    "# 6. 测试原始模型\n",
    "test_prompt = \"新款智能手机，搭载最新AI芯片，超长续航\"\n",
    "print(\"\\n=== 原始模型输出 ===\")\n",
    "print(generate_response(test_prompt, original_model, tokenizer))\n",
    "\n",
    "# 7. 加载微调后的模型\n",
    "try:\n",
    "    print(\"\\n加载微调后的模型...\")\n",
    "    tuned_model = PeftModel.from_pretrained(\n",
    "        original_model,\n",
    "        peft_model_path,\n",
    "        device_map=\"auto\"\n",
    "    )\n",
    "    tuned_model.eval()\n",
    "    \n",
    "    # 合并LoRA权重（对于4-bit模型需要特殊处理）\n",
    "    print(\"合并LoRA权重...\")\n",
    "    tuned_model = tuned_model.merge_and_unload()\n",
    "    \n",
    "    print(\"\\n=== 微调后模型输出 ===\")\n",
    "    print(generate_response(test_prompt, tuned_model, tokenizer))\n",
    "except Exception as e:\n",
    "    print(f\"加载微调模型失败: {e}\")\n",
    "\n",
    "print(\"\\n测试完成!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1ea07dbf-c93b-4442-8ce8-c645b120d751",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
